(()=>{
    "use strict";
    const $toString = Function.toString;
    const myFunction_toString_symbol = Symbol('('.concat('',')_',(Math.random()+'').toString(36)));
    const myToString = function(){
        return typeof this =='function'&&this[myFunction_toString_symbol]||$toString.call(this);
    };
    function set_native(func,key,value){
        Object.defineProperty(func,key,{
            "enumerable":false,
            "configurable":true,
            "writable":true,
            "value":value
        })
    };
    delete Function.prototype['toString'];
    set_native(Function.prototype,"toString",myToString);
    set_native(Function.prototype.toString,myFunction_toString_symbol,"function toString() { [native code] }");
    this.func_set_natvie = (func) =>{
        set_native(func,myFunction_toString_symbol,`function ${myFunction_toString_symbol,func.name || ''}() { [native code] }`);
    };
}).call(this);
catvm.safefunction = this.func_set_natvie;
// module.exports=this.func_set_natvie;


catvm.safe_Objattribute = function (Obj, safe_get_attribute, safe_set_attribute, safe_func_attribute, oneself) {
    /*
    Obj：                需要保护的对象, 默认是保护对象的原型对象
    safe_get_attribute： 需要保护的 get 属性
    safe_set_attribute： 需要保护的 set 属性
    safe_func_attribute：需要保护的 func 属性
    oneself：            如果指定了这个参数 为 true，则说明是保护的自身，而不是原型链
    */
    const obj = oneself ? Obj : Obj.prototype;

    // 保护get属性
    for (let key of safe_get_attribute) {
        catvm.safefunction(Object.getOwnPropertyDescriptor(obj, key)['get']);
    }
    // 保护set属性
    for (let key of safe_set_attribute) {
        catvm.safefunction(Object.getOwnPropertyDescriptor(obj, key)['set']);
    }
    // 保护func属性
    for (let key of safe_func_attribute) {
        catvm.safefunction(obj[key]);
    }
}